package ar.edu.phm.tpdos.asignarAVariableValidador;

import java.util.ArrayList;

import ar.edu.phm.tpdos.annotations.Validable;

public aspect ValidadorAspectj {
	private ArrayList<ObjetoValidable> validadores = new ArrayList<ObjetoValidable>();

	pointcut seEscribeVariable(Object target, Object newValue) :  
		set(* *..*)
		&& args(newValue) 
		&& target(target)
		&& !withincode(*.new(..))
		&& within(@Validable *);

	before(Object target, Object newValue) : seEscribeVariable(target, newValue) {
		String fieldName = thisJoinPoint.getSignature().getName();
		notificarValidadores(target, fieldName, newValue);
	}

	public void agregarValidador(Object target, String validable,
			Validador<?> validador) {
		validadores.add(new ObjetoValidable(target, validable, validador));
	}

	public void quitarValidador(ObjetoValidable validador) {
		validadores.remove(validador);
	}

	public void notificarValidadores(Object target, String validable,
			Object valor) {
		for (int i = 0; i < validadores.size(); i++) {
			validadores.get(i).validar(target, validable, valor);
		}
	}

}
